/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ar.com.remiseria.bo;

import ar.com.remiseria.dao.ClienteDAO;
import ar.com.remiseria.entities.Cliente;
import ar.com.remiseria.entities.Documento;
import ar.com.remiseria.entities.Domicilio;
import ar.com.remiseria.utils.Constantes;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.exception.ConstraintViolationException;

/**
 *
 * @author mcvalls
 */
public class ClienteBO {

    public Cliente getClienteByTelefono(String telefono) throws Exception {
        
        Cliente cliente = new Cliente();
        ClienteDAO clienteDAO = new ClienteDAO();
        
        try{
            
            cliente = clienteDAO.getClienteByTelefono(telefono);
            
        }catch(HibernateException hex){
            
            hex.printStackTrace();
            throw new Exception("No se pudo obtener el cliente");
            
        }
        
        return cliente;
    }

    public Cliente saveNewCliente(Cliente cliente) throws Exception {
        
        ClienteDAO clienteDAO = new ClienteDAO();
        DocumentoBO documentoBO = new DocumentoBO();
        DomicilioBO domicilioBO = new DomicilioBO();
        
        try{
            Documento doc = documentoBO.saveNewDocumentoIfNotExists(cliente.getDocumento());
            Domicilio dom = domicilioBO.saveNewDomicilioIfNotExists(cliente.getDomicilio());
            cliente.setDocumento(doc);
            cliente.setDomicilio(dom);
            cliente = clienteDAO.saveNew(cliente);
        }catch(ConstraintViolationException ex){
            throw new Exception("Ya existe un cliente con el numero de telefono "+cliente.getTelefono()+
                    ".\nEl telefono es una clave unica, no se permite duplicados.");
        }catch(HibernateException ex){
            throw new Exception(ex);
        }catch(Exception ex){
            throw new Exception(ex); 
        }
        
        return cliente;
    }

    public List<Cliente> getAllClientes() throws Exception{
        ClienteDAO clienteDAO = new ClienteDAO();
        List<Cliente> clientes = new ArrayList<Cliente>();
        
        try{
            clientes = clienteDAO.getAll(Cliente.class);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return clientes;
        
    }

    public void deleteCliente(Cliente cliente) throws Exception {
        ClienteDAO clienteDAO = new ClienteDAO();
        try{
            clienteDAO.delete(cliente);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
    }

    public Cliente updateCliente(Cliente cliente) throws Exception {
         ClienteDAO clienteDAO = new ClienteDAO();
        DocumentoBO documentoBO = new DocumentoBO();
        DomicilioBO domicilioBO = new DomicilioBO();
        
        try{
            Documento doc = documentoBO.saveNewDocumentoIfNotExists(cliente.getDocumento());
            Domicilio dom = domicilioBO.saveNewDomicilioIfNotExists(cliente.getDomicilio());
            cliente.setDocumento(doc);
            cliente.setDomicilio(dom);
            cliente = clienteDAO.update(cliente);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }catch(Exception ex){
            throw new Exception(ex); 
        }
        
        return cliente;
    }

    public int getChoferesCount() throws Exception {
        int clientesTotales = 0;
        ClienteDAO clienteDAO = new ClienteDAO();
        
        try{
            clientesTotales = clienteDAO.getCount(Cliente.class);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return clientesTotales; 
    }
    
    public List<Cliente> getAllClientes(int paginaActual) throws Exception{
        ClienteDAO clienteDAO = new ClienteDAO();
        List<Cliente> clientes = new ArrayList<Cliente>();
        
        int start = 0;
        
        if(paginaActual > 1){
            start = ((paginaActual -1 ) * Constantes.PAG_MAX_RESULTS) + 1;
        }
        
        try{
            clientes = clienteDAO.getAll(Cliente.class, start);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return clientes;
        
    }

    public List<Cliente> getAllClientesByFiltro(int paginaActual, String palabraClave) throws Exception{
        List<Cliente> losClientes = new ArrayList<Cliente>();
        ClienteDAO clienteDAO = new ClienteDAO();
        
        int start = 0;
        if(paginaActual > 1){
            start = ((paginaActual -1 ) * Constantes.PAG_MAX_RESULTS) + 1;
        }
        
        try{
            losClientes = clienteDAO.getAllByFiltro(start, palabraClave);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return losClientes;
    }
}
